#!/bin/sh

MODULE_NAME=transparentMode
MODULE_DEFAULTS=/opt/$MODULE_NAME/etc/defaults
MODULE_SETTINGS=/opt/$MODULE_NAME/etc/settings
[ -L "$MODULE_SETTINGS" ] && MODULE_SETTINGS=`readlink $MODULE_SETTINGS`

[ -f "$MODULE_SETTINGS" ] || cp $MODULE_DEFAULTS $MODULE_SETTINGS
[ -x "/sbin/hash_verify" ] && [ ! -f "$MODULE_SETTINGS.hash" ] && cp $MODULE_DEFAULTS.hash $MODULE_SETTINGS.hash

# Outputs:
#  Print platform name (v1, v1i, v2i, v3, v4, v4i) if exists otherwise empty string is returned.
# Exit status:
#  Return 0 in any case
get_platform() {
  grep ICR_PLATFORM= /etc/os-release 2> /dev/null | sed s/ICR_PLATFORM=//
}

# The QuecOpen service on the SoM platforms reapplies its own network settings
# behind our back. The work-arounds guarded by som_platform below exist only
# for that and must not run on any other platform.
case "`get_platform`" in
  v1|v1i) som_platform=1 ;;
  *)      som_platform=0 ;;
esac

if [ -x "/sbin/hash_generate" ]
then
  etc_dir="/var/etc/"
  dhcp_config_dir="/run/dhcp"
else
  etc_dir="/etc/"
  dhcp_config_dir="/var/dhcp"
fi

if [ "$som_platform" = 1 ] && [ -d "/run/dhcp" ]; then
  etc_dir="/var/etc/"
  dhcp_config_dir="/run/dhcp"
fi

persistent_dir="/var/data/transparentMode/"

case "$1" in

  start)
    echo -n "Starting module Transparent mode: "
    [ -x "/sbin/hash_verify" ] && ! hash_verify $MODULE_SETTINGS && exit 1
    . $MODULE_SETTINGS
    if [ "$MOD_TRANSPARENTMODE_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi
    mkdir -p $persistent_dir
    if [ ! -f $persistent_dir/setting-nat.orig ]; then
      grep 'ETH_DHCP_POOL_ENABLED=' $etc_dir/settings.eth > $persistent_dir/setting-eth-dhcp.orig
      grep 'NAT_MASQUERADE=' $etc_dir/settings.nat > $persistent_dir/setting-nat.orig
    fi

    # Vypnuti vychoziho DHCP serveru a NATu
    if grep -q "ETH_DHCP_POOL_ENABLED=1" $etc_dir/settings.eth
    then
      sed -e "s/\(ETH_DHCP_POOL_ENABLED=\).*/\10/" -i $etc_dir/settings.eth
      if [ -x "/sbin/hash_generate" ]
      then
        /sbin/hash_generate $etc_dir/settings.eth
      fi
    fi
    if grep -q "NAT_MASQUERADE=1" $etc_dir/settings.nat
    then
      sed -e "s/\(NAT_MASQUERADE=\).*/\10/" -i $etc_dir/settings.nat
      if [ -x "/sbin/hash_generate" ]
      then
        /sbin/hash_generate $etc_dir/settings.nat
      fi
      service nat restart
    fi
    # Zapnuti transparentniho rezimu
    service ppp restart

    echo "done"
    exit 0
  ;;

  stop)
    echo -n "Stopping module Transparent mode: "
    # Obnoveni vychozi konfigurace
    if [ -f $persistent_dir/setting-nat.orig -a "$(grep 'NAT_MASQUERADE=' $etc_dir/settings.nat)" != "$(cat $persistent_dir/setting-nat.orig)" ]
    then
      grep -v 'NAT_MASQUERADE=' $etc_dir/settings.nat > $etc_dir/settings.nat.new
      cat $persistent_dir/setting-nat.orig >> $etc_dir/settings.nat.new
      mv $etc_dir/settings.nat.new $etc_dir/settings.nat
      if [ -x "/sbin/hash_generate" ]
      then
        /sbin/hash_generate $etc_dir/settings.nat
      fi
      service nat restart
    fi
    if [ -f $persistent_dir/setting-eth-dhcp.orig -a "$(grep 'ETH_DHCP_POOL_ENABLED=' $etc_dir/settings.eth)" != "$(cat $persistent_dir/setting-eth-dhcp.orig)" ]
    then
      grep -v 'ETH_DHCP_POOL_ENABLED=' $etc_dir/settings.eth > $etc_dir/settings.eth.new
      cat $persistent_dir/setting-eth-dhcp.orig >> $etc_dir/settings.eth.new
      mv $etc_dir/settings.eth.new $etc_dir/settings.eth

      if [ -x "/sbin/hash_generate" ]
      then
        /sbin/hash_generate $etc_dir/settings.eth
      fi
    fi
    rm -f "$persistent_dir/setting-eth-dhcp.orig" "$persistent_dir/setting-nat.orig"
    # Vypnuti proxy arp
    echo 0 > /proc/sys/net/ipv4/conf/eth0/proxy_arp
    if [ -f /run/transparentMode/wan_interface ]
    then
      dev=$(cat /run/transparentMode/wan_interface)
      rm /run/transparentMode/wan_interface
      if [ -n "$dev"]
      then
        echo 0 > /proc/sys/net/ipv4/conf/$dev/proxy_arp
      fi
    fi
    # Obnoveni konfigurace eth rozhranni
    ifconfig eth0:0 down
    killall dhcpd
    rm /var/run/dhcpd.pid
    rm $dhcp_config_dir/dhcpd.leases
    service eth restart
    # Obnoveni konfigurace ppp rozhranni
    service ppp restart
    echo "done"
    exit 0
  ;;

  restart)
    $0 stop
    $0 start
  ;;

  status)
    if [ -f $persistent_dir/setting-nat.orig ]; then
      if [ -f /run/transparentMode/wan_interface ]; then
        echo "Transparent mode is configured and it is used for $(cat /run/transparentMode/wan_interface)."
      else
        echo "Transparent mode is configured but it is not used."
      fi
    else
      echo "Transparent mode is OFF."
    fi
    exit 0
  ;;

  defaults)
    cp $MODULE_DEFAULTS $MODULE_SETTINGS 2>/dev/null
    [ -f "$MODULE_DEFAULTS.hash" ] && cp $MODULE_DEFAULTS.hash $MODULE_SETTINGS.hash
    exit 0
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
  ;;

esac
